import { useRSAEncrypt } from '@/composables/useRSAEncrypt';

/**
 * 提交数据字段的加密说明
 * 提交数据加密是在https加密通道基础上额外的RSA加密
 * 对哪些数据加密是从后端获取的
 * 前端根据后端返回的字段数组，加密指定字段
 */

const { encrypt } = useRSAEncrypt();
async function processAndEncrypt(data, encryptFields) {
  if (!encryptFields || !Array.isArray(encryptFields)) {
    return data;
  }

  // 拷贝数据
  const processedData = JSON.parse(JSON.stringify(data));

  if (encryptFields.includes('*')) {
    // 如果包含 *，则对数据中所有的字符串字段加密（如修改必须和后端对应起来）
    for (const key in processedData) {
      if (processedData.hasOwnProperty(key)) {
        const value = processedData[key];
        // 只加密字符串类型的数据
        if (typeof value === 'string' && value.trim() !== '') {
          processedData[key] = await encrypt(value);
        }
      }
    }
  } else {
    // 否则，只加密指定字段
    for (const field of encryptFields) {
      // 使用 for...of 循环
      if (processedData.hasOwnProperty(field)) {
        const value = processedData[field];
        // 只加密字符串类型的数据
        if (typeof value === 'string' && value.trim() !== '') {
          processedData[field] = await encrypt(value);
        }
      }
    }
  }

  return processedData;
}

async function handleRequestData(data, encryptFields) {
  // 无数据不加密
  if (!data) return data;

  // 如后端未设置加密项则不加密
  if (encryptFields && encryptFields?.length <= 0) {
    console.log('提交的数据不加密');
    return data;
  }

  // 上传数据不加密
  if (data instanceof FormData) {
    return data;
  }

  // URL查询字符串加密
  if (data instanceof URLSearchParams) {
    const processedEntries = {};

    for (const [key, value] of data.entries()) {
      processedEntries[key] = value;
    }

    const encryptedData = await processAndEncrypt(
      processedEntries,
      encryptFields,
    );

    const newParams = new URLSearchParams();
    for (const [key, value] of Object.entries(encryptedData)) {
      newParams.append(key, value);
    }

    return newParams;
  }

  // 提交的处理普通对象加密
  if (typeof data === 'object') {
    const encryptData = await processAndEncrypt(data, encryptFields);
    return encryptData;
  }

  return data;
}

export { handleRequestData };
